package com.zking.filters;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.entity.Student;
import com.zking.utils.DBPoolUtils;

//Filter：过滤器
//配置过滤器的过程
//1.实现Filter接口(javax.servlet.Filter)，重写里面的方法
//2.配置这个过滤器到底过滤哪些东西
// /*:代表过滤所有
// /stu:过滤所有带stu路径的访问。
//urlPatterns = {"/stu", "/add.jsp"}:可以配置多个可拦截的路径
@WebFilter(urlPatterns = {"/*"})
public class LoginFilter implements Filter{

	//创建一个数组
	//需要放行的路径是哪些
	private String[] passPaths;
	
	//destroy:销毁。服务器停止的时候会被调用一次。
	@Override
	public void destroy() {
		System.out.println("过滤器destroy().......");
	}

	//doFilter:过滤动作。服务器启动过程中会一直调用这个方法。
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, 
			FilterChain chain)
			throws IOException, ServletException {
		//当我们过滤了所有的请求之后，前端发送了一个请求会直接进入到doFilter()方法
		//所有的请求都被这个LoginFilter给拦截了。
		System.out.println("过滤器doFilter().......");
		//判断这个路径是否需要被拦截
		//拿到请求的路径到底是什么
		//不需要拦截的：login.jsp reg.jsp /login
		//需要拦截的：其他jsp页面 /stu
		//HttpServletRequest extends ServletRequest
		HttpServletRequest hRequest = (HttpServletRequest) request;
		HttpServletResponse hResponse = (HttpServletResponse) response;
		//获取每次的请求路径
		//只剩下项目名称和参数之间的访问路径
		String ServletPath = hRequest.getServletPath();
		//全路径
		//StringBuffer requestURL = hRequest.getRequestURL();
		System.out.println("ServletPath="+ServletPath);
		//1.如果这个用户已经登录了，就不需要拦截任何东西
		//从session中获取用户
		Student user = (Student) hRequest.getSession().getAttribute("user");
		if (user == null) {
			//当前请求没有登录用户，需要判断它到底是来干嘛的
			//登陆、注册是不需要拦截的
			//判断ServletPath里面包含有login、reg就需要通过
			if (isPass(ServletPath)) {
				chain.doFilter(request, response);
			} else {
				//重定向到登录界面
				hRequest.getSession().setAttribute("loginMsg", "无权限访问，请先登录!!!");
				hResponse.sendRedirect("login?m=loginPage");
			}
		} else {
			//通过这个请求
			chain.doFilter(request, response);
		}
	}

	
	/**
	 * 判断哪些页面是需要放行的
	 * @param servletPath
	 */
	private boolean isPass(String servletPath) {
		for (int i = 0; i < passPaths.length; i++) {
			//判断数组中是否有需要放行的路径
			if (servletPath.contains("/"+passPaths[i])) {
				return true;
			}
		}
		return false;
	}

	//init:初始化。服务器第一次启动的时候会调用一次这个方法。
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("过滤器init().......");
		//读取properties的文件
		Properties p = DBPoolUtils.getProperties("filters.properties");
		//覆盖上面的数组
		passPaths = p.getProperty("passPaths").split(",");
	}

}
